#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>

Adafruit_SSD1306 display(128, 32, &Wire, -1);

// 存储接收到的文本数据
String receivedText = "";
String currentLine = "";
bool textUpdated = false;
unsigned long lastUpdateTime = 0;
int scrollPosition = 0;
bool isReceivingNewData = false;

// 函数声明
void displayText(String text, int startPos);
void updateDisplay();
void scrollText();

void displayText(String text, int startPos) {
  int lineHeight = 8;
  int maxLines = 4; // 32像素高度最多显示4行
  int maxChars = 21; // 128像素宽度大约可显示21个字符
  
  // 将文本分行显示
  int currentY = 0;
  int textPos = startPos;
  
  for (int line = 0; line < maxLines && textPos < text.length(); line++) {
    String lineText = "";
    int charCount = 0;
    
    // 提取一行文本
    while (textPos < text.length() && charCount < maxChars) {
      char c = text.charAt(textPos);
      if (c == '\n') {
        textPos++;
        break;
      }
      lineText += c;
      textPos++;
      charCount++;
    }
    
    // 显示这一行
    display.setCursor(0, currentY);
    display.println(lineText);
    currentY += lineHeight;
  }
}

void updateDisplay() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  
  if (isReceivingNewData && receivedText.length() == 0) {
    // 正在接收新数据时显示更新提示
    display.setCursor(0, 0);
    display.println("剪贴板显示器");
    display.setCursor(0, 10);
    display.println("正在更新...");
  } else if (receivedText.length() == 0) {
    // 没有接收到数据时显示等待信息
    display.setCursor(0, 0);
    display.println("剪贴板显示器");
    display.setCursor(0, 10);
    display.println("等待数据...");
  } else {
    // 显示接收到的文本
    displayText(receivedText, scrollPosition);
  }
  
  display.display();
}

void scrollText() {
  if (receivedText.length() > 84) { // 如果文本长度超过4行的显示能力
    scrollPosition++;
    if (scrollPosition >= receivedText.length()) {
      scrollPosition = 0; // 重新开始滚动
    }
    updateDisplay();
  }
}

void setup() {
  // 初始化串口通信，波特率115200匹配ser.py
  Serial.begin(115200);
  
  // 初始化OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  
  // 显示初始界面
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("剪贴板显示器");
  display.setCursor(0, 10);
  display.println("等待数据...");
  display.display();
}

void loop() {
  // 检查串口是否有数据
  if (Serial.available()) {
    char incomingByte = Serial.read();
    
    if (incomingByte == '\n') {
      // 换行符表示一行数据结束，检查是否为控制指令
      if (currentLine == "<CLEAR>") {
        // 清屏指令：清空所有文本
        receivedText = "";
        isReceivingNewData = true;
        textUpdated = true;
        Serial.println("清屏指令已执行"); // 发送确认消息
      } else if (currentLine == "<END>") {
        // 结束指令：新内容接收完成
        isReceivingNewData = false;
        textUpdated = true;
        lastUpdateTime = millis();
        Serial.println("内容接收完成"); // 发送确认消息
      } else if (isReceivingNewData || receivedText.length() == 0) {
        // 普通数据：添加到接收文本中
        receivedText += currentLine;
        textUpdated = true;
        lastUpdateTime = millis();
      }
      
      currentLine = ""; // 清空当前行
    } else if (incomingByte != '\r') {
      // 添加字符到当前行（忽略回车符）
      currentLine += incomingByte;
    }
  }
  
  // 如果有新文本更新，刷新显示
  if (textUpdated) {
    updateDisplay();
    textUpdated = false;
    scrollPosition = 0; // 重置滚动位置
  }
  
  // 实现文本滚动效果（如果文本过长且不在接收新数据）
  if (!isReceivingNewData && receivedText.length() > 0 && millis() - lastUpdateTime > 2000) {
    scrollText();
    delay(500); // 滚动速度控制
  }
}



